package org.convallaria.framework.common.constants.sys;

/**
 * 部门相关常量
 * 
 * 功能特性：
 * - 定义部门状态常量
 * - 定义部门字段长度限制
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class DeptConstants {

    private DeptConstants() {
        // 防止实例化
    }

    // ==================== 部门状态常量 ====================

    /**
     * 部门正常状态
     */
    public static final String DEPT_STATUS_NORMAL = "0";

    /**
     * 部门停用状态
     */
    public static final String DEPT_STATUS_DISABLED = "1";

    // ==================== 部门字段长度限制 ====================

    /**
     * 部门名称最大长度
     */
    public static final int DEPT_NAME_MAX_LENGTH = 30;

    /**
     * 部门编码最大长度
     */
    public static final int DEPT_CODE_MAX_LENGTH = 50;

    /**
     * 祖级列表最大长度
     */
    public static final int ANCESTORS_MAX_LENGTH = 500;

    /**
     * 负责人最大长度
     */
    public static final int LEADER_MAX_LENGTH = 20;

    /**
     * 联系电话长度
     */
    public static final int PHONE_LENGTH = 11;

    /**
     * 邮箱最大长度
     */
    public static final int EMAIL_MAX_LENGTH = 50;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    /**
     * 显示顺序最小值
     */
    public static final int ORDER_NUM_MIN = 0;

    /**
     * 显示顺序最大值
     */
    public static final int ORDER_NUM_MAX = 999;

    // ==================== 部门状态描述 ====================

    /**
     * 部门状态描述映射
     */
    public static final String[] DEPT_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    // ==================== 默认值常量 ====================

    /**
     * 默认部门状态
     */
    public static final String DEFAULT_DEPT_STATUS = DEPT_STATUS_NORMAL;

    /**
     * 默认父部门ID（根部门）
     */
    public static final Long DEFAULT_PARENT_ID = 0L;

    /**
     * 默认显示顺序
     */
    public static final int DEFAULT_ORDER_NUM = 0;

    /**
     * 默认祖级列表（根部门）
     */
    public static final String DEFAULT_ANCESTORS = "0";

    // ==================== 业务规则常量 ====================

    /**
     * 部门树最大深度
     */
    public static final int MAX_DEPT_DEPTH = 10;

    /**
     * 部门名称分隔符
     */
    public static final String DEPT_NAME_SEPARATOR = "/";

    /**
     * 祖级列表分隔符
     */
    public static final String ANCESTORS_SEPARATOR = ",";

    // ==================== 工具方法 ====================

    /**
     * 获取部门状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getDeptStatusDesc(String status) {
        if (DEPT_STATUS_NORMAL.equals(status)) {
            return DEPT_STATUS_DESCRIPTIONS[0];
        } else if (DEPT_STATUS_DISABLED.equals(status)) {
            return DEPT_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 验证部门状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptStatus(String status) {
        return DEPT_STATUS_NORMAL.equals(status) || DEPT_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证部门名称是否有效
     * 
     * @param deptName 部门名称
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptName(String deptName) {
        if (deptName == null || deptName.trim().isEmpty()) {
            return false;
        }
        return deptName.length() <= DEPT_NAME_MAX_LENGTH;
    }

    /**
     * 验证部门编码是否有效
     * 
     * @param deptCode 部门编码
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptCode(String deptCode) {
        if (deptCode == null || deptCode.trim().isEmpty()) {
            return true; // 部门编码可以为空
        }
        return deptCode.length() <= DEPT_CODE_MAX_LENGTH;
    }

    /**
     * 验证显示顺序是否有效
     * 
     * @param orderNum 显示顺序
     * @return true=有效，false=无效
     */
    public static boolean isValidOrderNum(Integer orderNum) {
        if (orderNum == null) {
            return false;
        }
        return orderNum >= ORDER_NUM_MIN && orderNum <= ORDER_NUM_MAX;
    }

    /**
     * 验证联系电话是否有效
     * 
     * @param phone 联系电话
     * @return true=有效，false=无效
     */
    public static boolean isValidPhone(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return true; // 联系电话可以为空
        }
        return phone.length() == PHONE_LENGTH && phone.matches("^1[3-9]\\d{9}$");
    }

    /**
     * 验证邮箱是否有效
     * 
     * @param email 邮箱
     * @return true=有效，false=无效
     */
    public static boolean isValidEmail(String email) {
        if (email == null || email.trim().isEmpty()) {
            return true; // 邮箱可以为空
        }
        if (email.length() > EMAIL_MAX_LENGTH) {
            return false;
        }
        return email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
    }

    /**
     * 判断是否为根部门
     * 
     * @param parentId 父部门ID
     * @return true=根部门，false=子部门
     */
    public static boolean isRootDept(Long parentId) {
        return parentId == null || DEFAULT_PARENT_ID.equals(parentId);
    }

    /**
     * 构建祖级列表
     * 
     * @param parentAncestors 父部门祖级列表
     * @param parentId 父部门ID
     * @return 祖级列表
     */
    public static String buildAncestors(String parentAncestors, Long parentId) {
        if (isRootDept(parentId)) {
            return DEFAULT_ANCESTORS;
        }
        if (parentAncestors == null || parentAncestors.trim().isEmpty()) {
            return String.valueOf(parentId);
        }
        return parentAncestors + ANCESTORS_SEPARATOR + parentId;
    }

    /**
     * 获取部门层级深度
     * 
     * @param ancestors 祖级列表
     * @return 层级深度
     */
    public static int getDeptDepth(String ancestors) {
        if (ancestors == null || ancestors.trim().isEmpty() || DEFAULT_ANCESTORS.equals(ancestors)) {
            return 1;
        }
        return ancestors.split(ANCESTORS_SEPARATOR).length + 1;
    }

    /**
     * 验证部门层级深度是否有效
     * 
     * @param ancestors 祖级列表
     * @return true=有效，false=无效
     */
    public static boolean isValidDeptDepth(String ancestors) {
        return getDeptDepth(ancestors) <= MAX_DEPT_DEPTH;
    }
}
